# Debian aptitude(1) completion                            -*- shell-script -*-

_have grep-status && {
    _comp_dpkg_hold_packages()
    {
        grep-status -P -e "^$1" -a -FStatus 'hold' -n -s Package
    }
} || {
    _comp_dpkg_hold_packages()
    {
        command grep -B 2 'hold' /var/lib/dpkg/status |
            awk "/Package: $1/ { print \$2 }"
    }
}

_aptitude()
{
    local cur prev words cword
    _init_completion || return

    local special i
    for ((i = 1; i < ${#words[@]} - 1; i++)); do
        if [[ ${words[i]} == @(@(|re)install|@(|un)hold|@(|un)markauto|@(dist|full|safe)-upgrade|download|show|forbid-version|purge|remove|changelog|why@(|-not)|keep@(|-all)|build-dep|@(add|remove)-user-tag|versions) ]]; then
            special=${words[i]}
            break
        fi
    done

    if [[ -v special ]]; then
        case $special in
            install | hold | markauto | unmarkauto | dist-upgrade | full-upgrade | \
                safe-upgrade | download | show | changelog | why | why-not | build-dep | \
                add-user-tag | remove-user-tag | versions)
                COMPREPLY=($(_xfunc apt-cache _apt_cache_packages))
                return
                ;;
            purge | remove | reinstall | forbid-version)
                COMPREPLY=(
                    $(_xfunc dpkg _comp_dpkg_installed_packages "$cur"))
                return
                ;;
            unhold)
                COMPREPLY=($(_comp_dpkg_hold_packages "$cur"))
                return
                ;;
        esac
    fi

    case $prev in
        # don't complete anything if these options are found
        autoclean | clean | forget-new | search | upgrade | update | keep-all)
            return
            ;;
        -!(-*)S)
            _filedir
            return
            ;;
        --display-format | --width | -!(-*)[wFo])
            return
            ;;
        --sort | -!(-*)O)
            COMPREPLY=($(compgen -W 'installsize installsizechange debsize
                name priority version' -- "$cur"))
            return
            ;;
        --target-release | --default-release | -!(-*)t)
            COMPREPLY=($(apt-cache policy |
                command grep "release.o=Debian,a=$cur" |
                command sed -e "s/.*a=\(\w*\).*/\1/" | uniq 2>/dev/null))
            return
            ;;
    esac

    if [[ $cur == -* ]]; then
        local opts=" $($1 --help 2>&1 | command sed -e \
            's/--with(out)-recommends/--without-recommends\n--with-recommends/' |
            _parse_help - | tr '\n' ' ') "

        # Exclude some mutually exclusive options
        for i in "${words[@]}"; do
            [[ $i == -u ]] && opts=${opts/ -i / }
            [[ $i == -i ]] && opts=${opts/ -u / }
        done

        # Do known short -> long replacements; at least up to 0.8.12, --help
        # outputs mostly only short ones.
        COMPREPLY=($opts)
        for i in "${!COMPREPLY[@]}"; do
            case ${COMPREPLY[i]} in
                -h) COMPREPLY[i]=--help ;;
                -s) COMPREPLY[i]=--simulate ;;
                -d) COMPREPLY[i]=--download-only ;;
                -P) COMPREPLY[i]=--prompt ;;
                -y) COMPREPLY[i]=--assume-yes ;;
                -F) COMPREPLY[i]=--display-format ;;
                -O) COMPREPLY[i]=--sort ;;
                -W) COMPREPLY[i]=--show-why ;;
                -w) COMPREPLY[i]=--width ;;
                -V) COMPREPLY[i]=--show-versions ;;
                -D) COMPREPLY[i]=--show-deps ;;
                -v) COMPREPLY[i]=--verbose ;;
                -t) COMPREPLY[i]=--target-release ;;
                -q) COMPREPLY[i]=--quiet ;;
            esac
        done

        ((${#COMPREPLY[@]})) &&
            COMPREPLY=($(compgen -W '"${COMPREPLY[@]}"' -- "$cur"))
    else
        COMPREPLY=($(compgen -W 'update upgrade safe-upgrade forget-new
            clean autoclean install reinstall remove hold unhold purge markauto
            unmarkauto why why-not dist-upgrade full-upgrade download search
            show forbid-version changelog keep keep-all build-dep add-user-tag
            remove-user-tag versions' -- "$cur"))
    fi

} &&
    complete -F _aptitude -o default aptitude aptitude-curses

# ex: filetype=sh
